package com.azier.util;

import java.math.BigDecimal;
import java.text.DecimalFormat;

/**
 * @author 金建强(ptma@163.com)
 * @version 2016-3-15 13:40
 */
public final class NumberUtil {

    private NumberUtil(){
    }

    /**
     * 数字格式化
     *
     * @param pattern
     * @param x
     * @return 格式化后的字符串
     */
    public static String format(String pattern, double x) {
        DecimalFormat df = new DecimalFormat(pattern);
        return df.format(x);
    }

    /**
     * 保留小数位(四舍五入)
     *
     * @param value 被保留小数的数字
     * @param scale 留的小数位数
     * @return 保留小数后的数字
     */
    public static double round(double value, int scale) {
        BigDecimal b = new BigDecimal(value);
        return b.setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 保留小数位(向上截断), 例如 roundUp(1.501, 2) = 1.51
     *
     * @param value 被保留小数的数字
     * @param scale 留的小数位数
     * @return 保留小数后的数字
     */
    public static double roundUp(double value, int scale) {
        BigDecimal b = new BigDecimal(value);
        return b.setScale(scale, BigDecimal.ROUND_UP).doubleValue();
    }

    /**
     * 保留小数位(向下截断), 例如 roundDown(1.509, 2) = 1.50
     *
     * @param value 被保留小数的数字
     * @param scale 留的小数位数
     * @return 保留小数后的数字
     */
    public static double roundDown(double value, int scale) {
        BigDecimal b = new BigDecimal(value);
        return b.setScale(scale, BigDecimal.ROUND_DOWN).doubleValue();
    }

    /**
     * 转字符串并格式化小数位数
     *
     * @param value 数字
     * @param precision 小数位数
     * @return 数字字符串
     */
    public static String toString(double value, int precision) {
        // create decimal format string
        StringBuilder buf = new StringBuilder("0");
        if (precision > 0) {
            buf.append(".");
        }
        for (int i = 0; i < precision; i++) {
            buf.append("0");
        }
        // create a decimal format
        DecimalFormat format = new DecimalFormat(buf.toString());
        return format.format(value);
    }
}
